/**
 * 全局 ResizeObserver 错误处理工具
 * 用于抑制 ResizeObserver 循环错误在控制台和开发者工具中的显示
 */

// 抑制 ResizeObserver 循环错误
export function suppressResizeObserverErrors() {
  if (typeof window === 'undefined') return;

  // 设置一个标志，避免重复输出日志
  window._resizeObserverErrorsIgnored = true;

  // 1. 覆盖全局错误处理器
  const originalOnError = window.onerror;
  window.onerror = function(msg, url, line, column, error) {
    // 忽略 ResizeObserver 相关错误
    if (msg && typeof msg === 'string' && msg.includes('ResizeObserver')) {
      // 不再输出日志消息
      return true; // 阻止错误冒泡和显示
    }
    
    // 忽略 webpack-dev-server 相关错误
    if (url && typeof url === 'string' && url.includes('webpack-dev-server')) {
      return true;
    }
    
    // 其他错误使用原始处理器
    return originalOnError ? originalOnError(msg, url, line, column, error) : false;
  };
  
  // 2. 覆盖控制台错误函数
  const originalConsoleError = console.error;
  console.error = function(...args) {
    if (args.length > 0) {
      const firstArg = args[0];
      if (
        (typeof firstArg === 'string' && firstArg.includes('ResizeObserver')) ||
        (firstArg instanceof Error && firstArg.message && firstArg.message.includes('ResizeObserver'))
      ) {
        return; // 忽略 ResizeObserver 错误
      }
    }
    return originalConsoleError.apply(console, args);
  };

  // 3. 覆盖 webpack-dev-server 的错误处理
  try {
    // 尝试隐藏全屏错误覆盖层
    const originalError = console.error.bind(console);
    const hideOverlay = () => {
      const overlays = document.querySelectorAll('iframe[title="hmr-error-overlay"]');
      overlays.forEach(overlay => {
        if (overlay && overlay.parentNode) {
          overlay.parentNode.removeChild(overlay);
        }
      });
    };

    // 使用 MutationObserver 监听错误覆盖层的出现
    const observer = new MutationObserver(mutations => {
      mutations.forEach(mutation => {
        if (mutation.addedNodes) {
          mutation.addedNodes.forEach(node => {
            if (node.tagName === 'IFRAME' && node.title === 'hmr-error-overlay') {
              // 检查错误是否与 ResizeObserver 相关
              const errorFrames = node.contentDocument?.querySelectorAll('.error-message');
              if (errorFrames) {
                for (const frame of errorFrames) {
                  if (frame.textContent && frame.textContent.includes('ResizeObserver')) {
                    // 移除错误覆盖层
                    setTimeout(hideOverlay, 0);
                    break;
                  }
                }
              }
            }
          });
        }
      });
    });

    // 开始观察 body 中添加的元素
    if (document.body) {
      observer.observe(document.body, { childList: true, subtree: true });
    } else {
      window.addEventListener('DOMContentLoaded', () => {
        observer.observe(document.body, { childList: true, subtree: true });
      });
    }
  } catch (e) {
    // 不输出错误日志
  }
  
  // 4. 处理 webpack-dev-server 客户端覆盖层
  try {
    // 等待 DOM 加载完成
    window.addEventListener('DOMContentLoaded', () => {
      const style = document.createElement('style');
      style.textContent = `
        /* 隐藏 webpack-dev-server 的错误覆盖层 */
        #webpack-dev-server-client-overlay[data-message*="ResizeObserver"] {
          display: none !important;
        }
      `;
      document.head.appendChild(style);
    });
  } catch (e) {
    // 不输出错误日志
  }
}

// 恢复原始错误处理器的函数
export function restoreErrorHandlers() {
  if (typeof window === 'undefined') return;
  
  // 还原原始错误处理
  if (window._originalOnError) {
    window.onerror = window._originalOnError;
    window._originalOnError = null;
  }
  
  // 还原原始控制台错误函数
  if (window._originalConsoleError) {
    console.error = window._originalConsoleError;
    window._originalConsoleError = null;
  }
  
  // 重置标志
  window._resizeObserverErrorsIgnored = false;
}

export default {
  suppressResizeObserverErrors,
  restoreErrorHandlers
}; 